package com.bw.common;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtils {
    //密钥
    public static final String SECRET = "zjKkye4PN59B2wriTjtVCo3BOYoD1B";
    //生成token的过期时间
    public static final long EXPIRE = 1000 * 60 * 30;

    /**
     * 根据入参进行一系列的加密，生成一个token
     * @param payload 载荷  入参是一个对象，一般传入用户的基本信息
     * @return 返回一个token
     */
    public static String createToken(Object payload) {
        String jwtToken = Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")//使用hs256算法进行加密  此算法是对称性加密
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))//设置token的有效截止时间
                .claim("payload", JSONUtil.toJsonStr(payload))//存放载荷（用户信息）
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
        return jwtToken;
    }

    /**
     * 验证token是否有效
     * @param jwtToken
     * @return
     */
    public static boolean validToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     *  获取token里的载荷（用户信息）
     * @param jwtToken
     * @return
     */
    public static String parseToken(String jwtToken) {
        if (StrUtil.isEmpty(jwtToken)) {
            return null;
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
            Claims claims = claimsJws.getBody();
            return (String) claims.get("payload");
        } catch (Exception e) {
            return null;
        }
    }

}